package com.cskaoyan.javase.array._0introduction;
/**
 * 数组的引入
 * 引例：
 * 假设一个班上有80个人，现在需要统计，某一门课程的平均成绩，是否需要定义80个变量？
 * 编写一个程序，需要储存12个月份的天数，是否要定义12个变量呢？
 * 编写一个扑克程序，需要储存54张扑克的信息，是否要定义54个变量？
 * 如果程序需要储存上成千上万的数据，程序员是不是也要逐一定义成千上万个变量呢？
 *
 * 很明显，如果程序需要多少数据，就要定义多少个变量，也太过于麻烦了
 * 并且多个变量单独存在/单独定义没有任何关联，也不方便管理和维护。
 * 这样单独定义变量,会导致程序的扩展性很差,程序的可维护性很差
 *
 * 这样就好比，去超市购物，谁有人会把东西一个一个带回家。
 * 购物需要"袋子"装东西，Java变量也需要一个容器来存放它们。
 * Java的容器有很多，最基本的容器就是数组（Array），定义一个数组，就可以存储很多数据。
 * Java中的容器主要有两种:
 *      1.数组
 *      2.集合
 * 集合是实际开发中,最常用的容器,而数组容器基本上不会在开发中直接使用
 * 但是集合容器也是在数组的基础上进行开发的,所以数组是基础,是非常重要的.
 *
 *
 * 数组这种容器,对存储的元素是有要求的,它的定义是:
 *      数组是存储多个,具有相同数据类型的数据元素的有序容器（集合）。
 *
 * 定义中的重点是：
 *      1.数组能够存储多个数据元素,它是容器.
 *      2.这些数据元素的数据类型，必须一致(数组非常重要的特点)
 *          数组中存放的数据元素的数据类型决定了数组的数据类型
 *          比如int类型数组,就只能装int元素
 *          装有String类型元素的数组,一定是String类型数组
 *      3.这些数据是有序的：
 *          数组中的每个存储单元，都有唯一编号(下标)，该编号，从左向右，从0开始编号，最大值是"数组长度-1"
 *          比如一个长度为5的数组,它的下标区间是[0,4]
 *          这种编号，专业的术语称之为下标或者索引（index）
 *
 *      补充:
 *          1.数组本身是一种引用数据类型,存在数组类型变量,这个变量可以存储其它元素.
 *          2.数组里面，可以存储基本数据类型元素，也可以存储引用数据类型元素，但是一个数组里面只能存储同一种数据类型。
 *
 * 在具体讲解数组在Java代码中如何使用之前,先来了解一下数组的特点(优点/缺点):
 * 数组的缺点: 数组对内存空间的要求很高,在内存中创建数组之前,需要事先规划好一片连续的空间,这就意味着数组的存储空间一旦确定,就不可以更改了.
 *      具体来说,数组的长度一旦确定,就不可以更改了.
 *      这是数组非常显著的缺点,这个缺点就导致了开发中非常少见直接使用数组.
 *      这要求使用数组,必须事先明确容器的大小,数组过长会浪费空间,短了更不行
 *
 * 数组的优点: 数组的种种限制,种种缺点
 * 都是为了实现数组的最大优点: 随机访问,通过下标存取元素,效率很高.
 *
 * 数组在实际开发中不会直接使用,而是用集合封装了它
 * 现在集合中有一种容器,它有数组随机访问的优点,同时它的长度/容量大小还可以改变
 * 这就是集合中的ArrayList
 *
 * ArrayList的底层实现仍然是数组,所以它有下标,有随机访问
 * 同时它还可以自动根据存储元素的个数,自动进行扩容
 * 自动扩容: 不是突破数组长度不可变的限制,而是新建一个长度更大的数组
 *      然后将原先的元素统统复制过去,依赖于数组元素的拷贝实现自动扩容.
 *
 * @since 11:07
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 以上String类型数组args,就只能装String类型元素
    }
}
